package org.loginplugin.entity;

import org.bukkit.event.Cancellable;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.player.PlayerEvent;

import java.util.ArrayList;
import java.util.List;

public class LoginData {
    private static final List<String> RESTRICTS = new ArrayList<>();

    public static void addPlayerName(String playerNameIn) {
        String convertedName = playerNameIn.toLowerCase();
        // toLowerCase 返回一个小写的副本，是 String 类的一个成员方法
        if (!RESTRICTS.contains(convertedName)) {
            // contains 方法返回一个逻辑值，! 符号把它变为相反的值，因此这个 if 语句只有在 RESTRICTS 中不含 convertedName 时才会执行里面的部分
            RESTRICTS.add(convertedName);
        }
    }

    public static void removePlayerName(String playerNameIn) {
        String convertedName = playerNameIn.toLowerCase();
        RESTRICTS.remove(convertedName);
    }

    public static boolean hasPlayerName(String playerNameIn) {
        String convertedName = playerNameIn.toLowerCase();
        return RESTRICTS.contains(convertedName);
    }


    public static void cancelIfNotLoggedIn(Cancellable e) {
        // 这里写着 Cancellable，和上面的 List 是一个原理，说到底我们只需要「可以取消」这个功能就可以了，至于到底是哪个类，不重要


        if (e instanceof PlayerEvent) {
            // instanceof 关键字指示 Java 重新判断左边对象的类型是不是右边的类或者右边类的子类，也就是判断能否进行强制类型转换
            if (LoginData.hasPlayerName(((PlayerEvent) e).getPlayer().getName())) {
                // if 语句用于看看玩家是不是在限制列表中
                // (PlayerEvent) e 进行类型转换
                e.setCancelled(true);
            }
        } else if (e instanceof InventoryOpenEvent) {
            // else if 表示「上一条 if 的条件为假」并且「当前括号中的条件为真」时才执行大括号里面的内容，相当于「如果不是那样，而是这样，就做……」

            // 限制玩家打开物品栏，需要 InventoryOpenEvent
            if (LoginData.hasPlayerName(((InventoryOpenEvent) e).getPlayer().getName())) {

                e.setCancelled(true);
            }
        }
    }
}
